package net.adst.ui.other;

import net.adst.resources.Constants;
import net.adst.resources.VariableNames;
import net.adst.util.GBC;
import net.adst.util.MainDataBuilder;
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.util.CellRangeAddress;
import sun.net.ResourceManager;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;

/**
 * Created with IntelliJ IDEA.
 * User: Администратор
 * Date: 15.12.12
 * Time: 16:54
 * To change this template use File | Settings | File Templates.
 */
public class EditTecDialog extends JDialog {
    private JLabel fullNameLabel;
    private JTextField fullNameField;

    private JLabel shortNameLabel;
    private JTextField shortNameField;

    private JLabel rashodLabel;
    private JTextField rashodField;

    private JLabel salaryLabel;
    private JTextField salaryField;

    private JLabel hoursCostLabel;
    private JTextField hoursCostField;

    private JTable tecnicsTable;
    private DefaultTableModel tecnicsModel;

    private JButton addButton;
    private JButton saveButton;
    private JButton clearButton;
    private JButton removeButton;

    private HSSFWorkbook wb;

    public EditTecDialog() {
        setLayout(new GridBagLayout());
        addElements();
    }

    private void addElements() {
        Dimension dim = new Dimension(100, 20);
        fullNameLabel = new JLabel("полное название:");
        fullNameLabel.setMinimumSize(dim);
        fullNameLabel.setMaximumSize(dim);
        fullNameLabel.setPreferredSize(dim);
        fullNameField = new JTextField();
        fullNameField.setMinimumSize(dim);
        fullNameField.setMaximumSize(dim);
        fullNameField.setPreferredSize(dim);
        fullNameField.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                showAddButton();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                if (!fullNameField.getText().isEmpty()) {
                    showAddButton();
                }
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
            }
        });


        shortNameLabel = new JLabel("краткое название:");
        shortNameLabel.setMinimumSize(dim);
        shortNameLabel.setMaximumSize(dim);
        shortNameLabel.setPreferredSize(dim);
        shortNameField = new JTextField();
        shortNameField.setMinimumSize(dim);
        shortNameField.setMaximumSize(dim);
        shortNameField.setPreferredSize(dim);
        shortNameField.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                showAddButton();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                if (!shortNameField.getText().isEmpty()) {
                    showAddButton();
                }
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
            }
        });


        rashodLabel = new JLabel("расход(в час):");
        rashodLabel.setMinimumSize(dim);
        rashodLabel.setMaximumSize(dim);
        rashodLabel.setPreferredSize(dim);
        rashodField = new JTextField();
        rashodField.setMinimumSize(dim);
        rashodField.setMaximumSize(dim);
        rashodField.setPreferredSize(dim);
        rashodField.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                showAddButton();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                if (!rashodField.getText().isEmpty()) {
                    showAddButton();
                }
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
            }
        });

        salaryLabel = new JLabel("зарплата(в час):");
        salaryLabel.setMinimumSize(dim);
        salaryLabel.setMaximumSize(dim);
        salaryLabel.setPreferredSize(dim);
        salaryField = new JTextField();
        salaryField.setMinimumSize(dim);
        salaryField.setMaximumSize(dim);
        salaryField.setPreferredSize(dim);
        salaryField.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                showAddButton();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                if (!salaryField.getText().isEmpty()) {
                    showAddButton();
                }
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
            }
        });


        hoursCostLabel = new JLabel("стоимость часа:");
        hoursCostLabel.setMinimumSize(dim);
        hoursCostLabel.setMaximumSize(dim);
        hoursCostLabel.setPreferredSize(dim);
        hoursCostField = new JTextField();
        hoursCostField.setMinimumSize(dim);
        hoursCostField.setMaximumSize(dim);
        hoursCostField.setPreferredSize(dim);
        hoursCostField.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                showAddButton();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                if (!salaryField.getText().isEmpty()) {
                    showAddButton();
                }
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
            }
        });

        tecnicsModel = new DefaultTableModel( //NotEditableDefaultTableModel
                new Object[][]{
                },
                Constants.TEC_INFO_НEADER
        ) {
            @Override
            public boolean isCellEditable(final int row, final int col) {
                return false;
            }
        };
        tecnicsTable = new JTable(tecnicsModel);
        tecnicsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        tecnicsTable.setRowHeight(Constants.TABLE_ROW_HEIGHT);
        tecnicsTable.getTableHeader().setReorderingAllowed(false);
        tecnicsTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (e.getValueIsAdjusting())
                    return;
                ListSelectionModel lsm = (ListSelectionModel) e.getSource();
                if (!lsm.isSelectionEmpty()) {
                    saveButton.setEnabled(true);
                    final int selectedRow = lsm.getMinSelectionIndex();
                    if (selectedRow > -1) {
                        removeButton.setVisible(true);
                        fullNameField.setText(tecnicsTable.getValueAt(selectedRow, 0).toString());
                        shortNameField.setText(tecnicsTable.getValueAt(selectedRow, 1).toString());
                        rashodField.setText(tecnicsTable.getValueAt(selectedRow, 2).toString());
                        salaryField.setText(tecnicsTable.getValueAt(selectedRow, 3).toString());
                        hoursCostField.setText(tecnicsTable.getValueAt(selectedRow, 4).toString());
                    }
                }
            }
        }
        );

        addButton = new JButton("Добавить новую.");
        addButton.setFocusPainted(false);
        addButton.setVisible(false);
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    Double.valueOf(hoursCostField.getText());
                    Double.valueOf(salaryField.getText());
                    Double.valueOf(rashodField.getText());
                } catch (IllegalArgumentException e1) {
                    JOptionPane.showOptionDialog(null, "Расход топлива , зарплата и стоиомость могут быть только числами.\n Проверьте значения этих полей", "Неверно введены данные!!!", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
                    return;
                }
                try {
                    File file = new File(VariableNames.PATH_TO_INFO);
                    InputStream in = new FileInputStream(file);
                    HSSFWorkbook wb = new HSSFWorkbook(in);
                    ExcelExtractor extractor = new ExcelExtractor(wb);
                    extractor.setFormulasNotResults(false); // Считать формулы
                    HSSFSheet sheet = wb.getSheet("техника");
                    if (!checkTecExist(sheet)) {
                        HSSFRow row = sheet.createRow(sheet.getLastRowNum() + 1);
                        HSSFCellStyle style = wb.createCellStyle();
                        style.setBorderBottom(CellStyle.BORDER_THIN);
                        style.setBorderLeft(CellStyle.BORDER_THIN);
                        style.setBorderRight(CellStyle.BORDER_THIN);
                        style.setBorderTop(CellStyle.BORDER_THIN);

                        HSSFCell cel1 = row.createCell(1);
                        cel1.setCellValue(fullNameField.getText());
                        cel1.setCellStyle(style);
                        HSSFCell cel2 = row.createCell(2);
                        cel2.setCellValue(shortNameField.getText());
                        cel2.setCellStyle(style);
                        HSSFCell cel3 = row.createCell(3);
                        cel3.setCellValue(Double.valueOf(rashodField.getText()));
                        cel3.setCellStyle(style);
                        HSSFCell cel4 = row.createCell(4);
                        cel4.setCellValue(Double.valueOf(salaryField.getText()));
                        cel4.setCellStyle(style);
                        HSSFCell cel5 = row.createCell(5);
                        cel5.setCellValue(Double.valueOf(hoursCostField.getText()));
                        cel5.setCellStyle(style);
                        FileOutputStream fileOut = new FileOutputStream(VariableNames.PATH_TO_INFO);
                        wb.write(fileOut);
                        fileOut.close();


                        File fileBD = new File(VariableNames.PATH_TO_BD);
                        InputStream inBD = new FileInputStream(fileBD);
                        HSSFWorkbook wbBD = new HSSFWorkbook(inBD);
                        ExcelExtractor extractorBD = new ExcelExtractor(wbBD);
                        extractorBD.setFormulasNotResults(false); // Считать формулы
                        HSSFSheet sheetDB = wbBD.createSheet(shortNameField.getText());

                        CellRangeAddress cellRangeAddress = new CellRangeAddress(2, 2, 0, Constants.OUR_НEADER.length);
                        sheetDB.setAutoFilter(cellRangeAddress);

                        HSSFRow rowDB1 = sheetDB.createRow(0);
                        rowDB1.createCell(6).setCellValue("2013");
                        rowDB1.setHeight(new Short("800"));
                        HSSFRow rowDB2 = sheetDB.createRow(1);
                        rowDB2.createCell(0).setCellValue(fullNameField.getText());
                        rowDB1.setHeight(new Short("600"));
                        HSSFRow rowDB3 = sheetDB.createRow(2);
                        HSSFCellStyle cellStyle = wbBD.createCellStyle();
                        cellStyle.setBorderBottom(CellStyle.BORDER_THICK);
                        cellStyle.setBorderLeft(CellStyle.BORDER_THICK);
                        cellStyle.setBorderRight(CellStyle.BORDER_THICK);
                        cellStyle.setBorderTop(CellStyle.BORDER_THICK);

                        for (int i = 0; i < Constants.OUR_НEADER.length; i++) {
                            HSSFCell cell = rowDB3.createCell(i);
                            cell.setCellValue(Constants.OUR_НEADER[i]);
                            cell.setCellStyle(cellStyle);
                        }
                        FileOutputStream fileOutBD = new FileOutputStream(VariableNames.PATH_TO_BD);
                        wbBD.write(fileOutBD);
                        fileOutBD.close();


                        JOptionPane.showMessageDialog(null, "Изменение успешно сохранены", "Изменения сохранены", JOptionPane.OK_OPTION, new ImageIcon(ResourceManager.class.getResource("/images/success.png")));
                        clean();
                        fillingTable();
                    }
                } catch (IOException e1) {
                    JOptionPane.showOptionDialog(null, "Нет доступа к базе данных. Она используется другой программой.\n Закройте все программы которые могут использовать ее (скорее всего это excel)", "данные не изменены", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
                }


            }
        }

        );
        saveButton = new JButton(new ImageIcon(ResourceManager.class.getResource("/images/save.png")));
        saveButton.setFocusPainted(false);
        saveButton.setEnabled(false);
        saveButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    try {
                        Double.valueOf(hoursCostField.getText());
                        Double.valueOf(salaryField.getText());
                        Double.valueOf(rashodField.getText());
                    } catch (IllegalArgumentException e1) {
                        JOptionPane.showOptionDialog(null, "Расход топлива , зарплата и стоиомость могут быть только числами.\n Проверьте значения этих полей", "Неверно введены данные!!!", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
                        return;
                    }
                    File file = new File(VariableNames.PATH_TO_INFO);
                    InputStream in = new FileInputStream(file);
                    HSSFWorkbook wb = new HSSFWorkbook(in);
                    ExcelExtractor extractor = new ExcelExtractor(wb);
                    extractor.setFormulasNotResults(false); // Считать формулы
                    HSSFSheet sheet = wb.getSheet("техника");
                    if (tecnicsTable.getSelectedRow() > -1) {
                        for (int i = 0; i < sheet.getLastRowNum() + 1; i++) {
                            if (sheet.getRow(i) != null) {
                                if (sheet.getRow(i).getCell(1).toString().equalsIgnoreCase(tecnicsTable.getValueAt(tecnicsTable.getSelectedRow(), 0).toString()) && sheet.getRow(i).getCell(2).toString().equalsIgnoreCase(tecnicsTable.getValueAt(tecnicsTable.getSelectedRow(), 1).toString())) {
                                    sheet.getRow(i).getCell(1).setCellValue(fullNameField.getText());
                                    sheet.getRow(i).getCell(2).setCellValue(shortNameField.getText());
                                    sheet.getRow(i).getCell(3).setCellValue(Double.valueOf(rashodField.getText()));
                                    sheet.getRow(i).getCell(4).setCellValue(Double.valueOf(salaryField.getText()));
                                    sheet.getRow(i).getCell(5).setCellValue(Double.valueOf(hoursCostField.getText()));
                                    break;
                                }
                            }
                        }
                    }
                    FileOutputStream fileOut = new FileOutputStream(VariableNames.PATH_TO_INFO);
                    wb.write(fileOut);
                    fileOut.close();
                    MainDataBuilder.buildOurTecInfo();
                    JOptionPane.showMessageDialog(null, "Изменение успешно сохранены", "Изменения сохранены", JOptionPane.OK_OPTION, new ImageIcon(ResourceManager.class.getResource("/images/success.png")));
                    clean();
                    fillingTable();
                } catch (IOException e1) {
                    JOptionPane.showOptionDialog(null, "Нет доступа к базе данных. Она используется другой программой.\n Закройте все программы которые могут использовать ее (скорее всего это excel)", "данные не изменены", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
                }
            }
        }

        );

        clearButton = new

                JButton("Очистить форму");

        clearButton.setFocusPainted(false);
        clearButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                clean();
            }
        }

        );

        removeButton = new JButton("удалить технику");

        removeButton.setFocusPainted(false);
        removeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int response = JOptionPane.showOptionDialog(null, "Вы, действительно хотите удалить запись?", "Удалить?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
                if (response == JOptionPane.NO_OPTION) {
                    return;
                }
                if (response == JOptionPane.YES_OPTION) {
                    try {
                        File file = new File(VariableNames.PATH_TO_INFO);
                        InputStream in = new FileInputStream(file);
                        HSSFWorkbook wb = new HSSFWorkbook(in);
                        ExcelExtractor extractor = new ExcelExtractor(wb);
                        extractor.setFormulasNotResults(false); // Считать формулы
                        HSSFSheet sheet = wb.getSheet("техника");
                        if (tecnicsTable.getSelectedRow() > -1) {
                            for (int i = 0; i < sheet.getLastRowNum() + 1; i++) {
                                if (sheet.getRow(i) != null) {
                                    if (sheet.getRow(i).getCell(1).toString().equalsIgnoreCase(tecnicsTable.getValueAt(tecnicsTable.getSelectedRow(), 0).toString()) && sheet.getRow(i).getCell(2).toString().equalsIgnoreCase(tecnicsTable.getValueAt(tecnicsTable.getSelectedRow(), 1).toString())) {
                                        sheet.removeRow(sheet.getRow(i));
                                        break;
                                    }
                                }
                            }
                        }
                        FileOutputStream fileOut = new FileOutputStream(VariableNames.PATH_TO_INFO);
                        wb.write(fileOut);
                        fileOut.close();
                        JOptionPane.showMessageDialog(null, "Изменение успешно сохранены", "Изменения сохранены", JOptionPane.OK_OPTION, new ImageIcon(ResourceManager.class.getResource("/images/success.png")));
                        clean();
                        fillingTable();
                    } catch (IOException e1) {
                        JOptionPane.showOptionDialog(null, "Нет доступа к базе данных. Она используется другой программой.\n Закройте все программы которые могут использовать ее (скорее всего это excel)", "данные не изменены", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
                    }
                }

            }
        });

        JScrollPane scrollPane = new JScrollPane(tecnicsTable);

        add(fullNameLabel, new GBC(0, 0).setInsets(6, 5, 0, 0).setAnchor(GBC.WEST));

        add(fullNameField, new GBC(1, 0).setInsets(6, 5, 0, 0).setFill(GBC.HORIZONTAL).setAnchor(GBC.WEST));
        add(shortNameLabel, new GBC(0, 1).setInsets(3, 5, 0, 0).setAnchor(GBC.WEST));
        add(shortNameField, new GBC(1, 1).setInsets(1, 5, 0, 0).setFill(GBC.HORIZONTAL).setAnchor(GBC.WEST));
        add(rashodLabel, new GBC(2, 0).setInsets(6, 5, 0, 0).setAnchor(GBC.WEST));
        add(rashodField, new GBC(3, 0).setInsets(6, 5, 0, 0).setFill(GBC.HORIZONTAL).setAnchor(GBC.WEST));
        add(salaryLabel, new GBC(2, 1).setInsets(6, 5, 0, 0).setAnchor(GBC.WEST));
        add(salaryField, new GBC(3, 1).setInsets(6, 5, 0, 0).setFill(GBC.HORIZONTAL).setAnchor(GBC.WEST));
        add(hoursCostLabel, new GBC(4, 0).setInsets(6, 5, 0, 0).setAnchor(GBC.WEST));
        add(hoursCostField, new GBC(5, 0).setInsets(6, 5, 0, 0).setFill(GBC.HORIZONTAL).setAnchor(GBC.WEST));
        add(addButton, new GBC(5, 1).setInsets(3, 5, 0, 0).setAnchor(GBC.CENTER));
        add(saveButton, new GBC(6, 0, 1, 2).setInsets(3, 5, 0, 0).setAnchor(GBC.CENTER));
        add(removeButton, new GBC(6, 2).setInsets(3, 5, 0, 0).setAnchor(GBC.CENTER));
        add(clearButton, new GBC(5, 2).setInsets(3, 5, 2, 0).setAnchor(GBC.EAST));

        add(scrollPane, new GBC(0, 3, 7, 1).setFill(GBC.BOTH).setWeight(1, 1));

    }

    public void init() {
        setDialogSettings();
        fillingTable();
        getContentPane().setBackground(Constants.COLOR_LIGHT_BLUE);
        removeButton.setVisible(false);
        setVisible(true);
    }

    private void clean() {
        addButton.setVisible(false);
        tecnicsTable.getSelectionModel().clearSelection();
        removeButton.setVisible(false);
        saveButton.setEnabled(false);
        fullNameField.setText("");
        shortNameField.setText("");
        rashodField.setText("");
        salaryField.setText("");
        hoursCostField.setText("");

    }

    private void fillingTable() {
        try {
            File file = new File(VariableNames.PATH_TO_INFO);
            InputStream in = new FileInputStream(file);
            HSSFWorkbook wb = new HSSFWorkbook(in);
            ExcelExtractor extractor = new ExcelExtractor(wb);
            tecnicsModel.setRowCount(0);
            extractor.setFormulasNotResults(false); // Считать формулы
            HSSFSheet sheet = wb.getSheet("техника");
            for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
                if (sheet.getRow(i) != null && (!sheet.getRow(i).getCell(1).toString().isEmpty()) && (!sheet.getRow(i).getCell(2).toString().isEmpty())) {
                    this.tecnicsModel.addRow(new Object[]{sheet.getRow(i).getCell(1) != null ? sheet.getRow(i).getCell(1).toString() : "", sheet.getRow(i).getCell(2) != null ? sheet.getRow(i).getCell(2).toString() : "", sheet.getRow(i).getCell(3) != null ? sheet.getRow(i).getCell(3).toString() : "", sheet.getRow(i).getCell(4) != null ? sheet.getRow(i).getCell(4).toString() : "", sheet.getRow(i).getCell(5) != null ? sheet.getRow(i).getCell(5).toString() : ""});
                }
            }
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

    }

    private void showAddButton() {
        if (tecnicsTable.getSelectedRow() < 0 && !fullNameField.getText().isEmpty() && !shortNameField.getText().isEmpty() && !rashodField.getText().isEmpty() && !salaryField.getText().isEmpty() && !hoursCostField.getText().isEmpty()) {
            addButton.setVisible(true);
        } else {
            addButton.setVisible(false);
        }

    }

    private void setDialogSettings() {
        setModal(true);
        setResizable(false);
        setModalityType(ModalityType.APPLICATION_MODAL);
        pack();
        setLocationRelativeTo(Frame.getFrames()[0]);
        setTitle("Работа с техникой.");
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
//        getRootPane().setDefaultButton(saveButton);
    }

    private boolean checkTecExist(HSSFSheet sheet) {
        for (int i = 0; i < sheet.getLastRowNum() + 1; i++) {
            if (sheet.getRow(i) != null) {
                if (sheet.getRow(i).getCell(1).toString().equalsIgnoreCase(fullNameField.getText()) || sheet.getRow(i).getCell(2).toString().equalsIgnoreCase(shortNameField.getText())) {
                    JOptionPane.showOptionDialog(null, "Техника с таким именем уже существует.", "данные не добавлены.", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
                    return true;
                }
            }
        }
        return false;
    }
}
